package com.richpay.basejava.base14;

/**
 * 冒泡排序
 * <p>
 * n个数字类排序，两两相比小靠前；
 * 外层循环n-1；内层循环n-1-i；
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] intArray = {15, 23, 8, 10, 7};
        System.out.println("原始数组:");
        print(intArray);
        bubbleSort(intArray);

        System.out.println("排序后的数组:");
        print(intArray);
    }

    /**
     * @param array 传入一个数组，依次打印数组元素的值
     */
    static void print(int[] array) {
        for (int i : array) {
            System.out.print(i + " ");
        }
        System.out.println();//换行

    }

    /**
     * 进行冒泡排序
     * 15   23   8    10   7
     *
     * ====================== 第一趟
     * 第一次比较 15/23 位置不变。
     * 15   23   8    10   7
     * 第二次比较 23/8  位置互换。
     * 15   8    23   10   7
     * 第三次比较 23/10 位置互换。
     * 15   8    10   23   7
     * 第四次比较 23/7  位置互换。
     * 15   8    10    7   23  ----> 完成第一趟比较后的数组
     *
     * ====================== 第二趟
     * 第一次比较 15/8  位置互换。
     * 8    15   10    7   23
     * 第二次比较 15/10 位置互换。
     * 8    10   15    7   23
     * 第三次比较 15/7  位置互换。
     * 8    10   7     15  23  ----> 完成第二趟比较后的数组
     *
     * ====================== 第三趟
     * 第一次比较 8/10   位置不变
     * 8    10   7     15  23
     * 第二次比较 10/7   位置互换
     * 8    7   10     15  23  ----> 完成第三趟比较后的数组
     *
     * ====================== 第四趟
     * 第一次比较 8/7    位置互换
     * 7    8   10     15  23  ----> 完成第四趟比较后的数组
     *
     * @param array
     */
    static void bubbleSort(int[] array) {
        int len = array.length;//获取数组中元素的个数
        for (int i = 0; i < len - 1; i++) {//外层循环控制比较的趟数

            for (int j = 0; j < len - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    swap(array, j, j + 1);
                }
            }
        }
    }

    /**
     * 完成数组中索引为i的元素和索引为j的元素的位置交换
     *
     * @param array 数组
     * @param i     索引i
     * @param j     索引j
     */
    static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
